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)。
本文来自博客园,作者:永恒&,转载请注明原文链接:https://www.cnblogs.com/Sun-yuan/p/13027159.html