合并两个排序的链表

  • 描述
输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
 
数据范围: 0n1000,10001000
要求:空间复杂度 O(1),时间复杂度 O(n)
 
如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6}
 
  • 示例1
输入:{1,3,5},{2,4,6}
返回值:{1,2,3,4,5,6}
 
  • 示例2
输入:{},{}
返回值:{}
 
  • 算法思想
1、先进行特殊情况的判断,若有一个链表为空,则返回另一个链表。
2、然后再判断哪个链表的头结点的值小,将头结点值大的链表合并至头结点值小的链表当中。
3、最后,若头结点值小的链表已到尾部,而头结点值大的链表仍有元素,就将剩下元素直接放到目标链表的尾部,并返回相应的目标链表。
 
  • 代码
 1 /*
 2 struct ListNode {
 3     int val;
 4     struct ListNode *next;
 5     ListNode(int x) :
 6             val(x), next(NULL) {
 7     }
 8 };*/
 9 class Solution {
10   public:
11     ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
12         ListNode* pre = nullptr;
13         ListNode* p = pHead1;
14         ListNode* q = pHead2;
15         //特殊情况判断
16         if(pHead1==nullptr)  return pHead2;
17         if(pHead2==nullptr)  return pHead1;
18         //L2合并至L1
19         if (q->val >= p->val) {
20             while (p && q) {
21                 if (q->val >= p->val) {
22                     pre = p;
23                     p = pre->next;
24                 } else {
25                     ListNode* r = q->next;
26                     q->next = p;
27                     pre->next = q;
28                     pre = q;
29                     q = r;
30                 }
31             }
32 
33             if (q) {
34                 pre->next = q;
35             }
36             return pHead1;
37         } else {          //L1合并至L2
38             while (p && q) {
39                 if (p->val >= q->val) {
40                     pre = q;
41                     q = pre->next;
42                 } else {
43                     ListNode* r = p->next;
44                     p->next = q;
45                     pre->next = p;
46                     pre = p;
47                     p = r;
48                 }
49             }
50             if (p) {
51                 pre->next = p;
52             }
53             return pHead2;
54         }
55     }
56 };

 

posted on 2023-05-05 13:36  _月生  阅读(19)  评论(0编辑  收藏  举报