LeetCode 21 合并两个有序链表

 1 /**
 2  * Definition for singly-linked list.  //链表的结构体定义
 3  * struct ListNode {    //结点的定义
 4  *     int val;    //结点的值,整形
 5  *     struct ListNode *next;  //下一个结点的地址,结点型指针
 6  * };
 7  */
 8 
 9 
10 struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2)
11 {
12     struct ListNode* head=(struct ListNode*)malloc(sizeof(struct ListNode));  //定义head为指针类型的ListNode类型的结构体,即链表的一个指针型的结点
13     struct ListNode* t=head;  //临时变量,初值为head
14     if(!l1) return l2;  
15     if(!l2) return l1;
16     while(l1 && l2)
17     {
18         if(l1->val <= l2->val)
19         {
20             t->next = l1;
21             l1 = l1->next;
22         }
23         else
24         {
25             t->next = l2;
26             l2 = l2->next;
27         }
28         t = t->next;
29     }
30     if(l1) t->next = l1;
31     if(l2) t->next = l2;
32     return head->next;
33     
34 }

所有情况:

1、只有l1

2、只有l2

3、l1和l2都有,且l1先遍历完

4、l1和l2都有,且l2先遍历完

总体思路:

1、如果只有l1,则l2为空;只需判断l2是否为真,为真就输出l2;否则就是l1和l2 同时为空;

2、如果l1和l2都为真时,说明他们的val中有值,则比较他们的val;

令t=l1和l2中val值小的那个节点(因为t是结点类型的指针);

小的结点向后走,大的那个不动;

给t赋值后,t要向后走

3、如果l1或者l2 有一个先遍历结束的话,令t->next = 没有遍历结束的那个链表即可(while遍历结束时 , t->next=NULL)。

posted @ 2020-06-01 19:54  永恒&  阅读(37)  评论(0编辑  收藏  举报