21. Merge Two Sorted List

---恢复内容开始---

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

Example:

Input: 1->2->4, 1->3->4
Output: 1->1->2->3->4->4

合并两个有序链表,最后返回新的链表。实现思路很简单,对比两个链表每一个结点值的大小,然后优先拼接到新表的尾部。

1.非递归方法:

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     struct ListNode *next;
 6  * };
 7  */
 8 struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
 9     if(l1 == NULL) return l2;
10     if(l2 == NULL) return l1;
11     if(l1==NULL && l2==NULL) return NULL;
12     struct ListNode *head=NULL;
13     if(l1->val < l2->val)
14     {
15         head=l1;
16         l1=l1->next;
17     }
18     else
19     {
20         head=l2;
21         l2=l2->next;
22     }
23     struct ListNode *p=head; 
24     while(l1 && l2)
25     {
26         if(l1->val < l2->val)
27         {
28             p->next=l1;
29             l1=l1->next;
30         }
31         else
32         {
33            p->next=l2;
34            l2=l2->next;
35         }
36         p=p->next;
37     }
38  
39     if(l1) p->next=l1;  //如果还剩下l1结点,则把l1加到新链表
40     if(l2) p->next=l2;  //如果还剩下l2结点,则把l2加到新链表
41     return head;
42 }

2.递归方法。这个方法还是看别的大神做的,代码很简洁,很惊艳。

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     struct ListNode *next;
 6  * };
 7  */
 8 struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
 9     if(l1 == NULL) return l2;
10     if(l2 == NULL) return l1;
11     if(l1==NULL && l2==NULL) return NULL;
12     //假如一开始是l1数据域小,递归结束后返回新l1(即首地址),反之同理。
13     if(l1->val <= l2->val){
14         l1->next = mergeTwoLists(l1->next,l2);
15         return l1;
16     }else{
17         l2->next = mergeTwoLists(l1,l2->next);
18         return l2;
19     }
20 }

 

posted @ 2018-10-23 20:18  杜王町上班族  阅读(274)  评论(0编辑  收藏  举报