合并两个排序链表

题目

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

思路

建头、尾新指针。两个链表,链表头结点值,尾指针指向较小值的结点,然后此链表头指针后移一位,直至有一个链表结束。返回新指针。

示例

list1:0 1 2 3 4 5 6 7
list2:3 4 5 6 7 8 9 10 11 12 13
合并后:0 1 2 3 3 3 4 4 5 5 6 6 7 7 8 9 10 11 12 13

代码

#include <iostream>

using namespace std;

struct ListNode {
    int val;
    ListNode * next;
    ListNode(int x):
        val(x),next(nullptr){
    }
};

class Solution{
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2){
       ListNode* nHead(nullptr),*tail(nullptr);
       if(pHead1 == nullptr)
           return pHead2;
       if(pHead2 == nullptr)
           return pHead1;
       if(pHead1 -> val < pHead2 -> val){
           nHead = tail = pHead1;
           pHead1 = pHead1 -> next;
       } else{
           nHead = tail = pHead2;
           pHead2 = pHead2 -> next;
       }
       while (pHead1 && pHead2 ){
           if(pHead1 -> val < pHead2 -> val){
               tail -> next = pHead1;
               tail = tail -> next;
               pHead1 = pHead1 ->next;
           } else{
               tail -> next = pHead2;
               tail = tail -> next;
               pHead2 = pHead2 -> next;
           }
       }
       if(pHead1 == nullptr)
           tail -> next = pHead2;
       else if(pHead2 == nullptr)
           tail -> next = pHead1;

        return nHead;
    }
};
int main(){
    Solution re;
    struct ListNode* head,*list1,*list2,*head2;
    struct ListNode node(0),node1(3);
    list1 = head = &node;
    for (int i = 1; i < 8; ++i) {
        struct ListNode *p = new ListNode(i);
        head -> next = p;
        head = head -> next;
    }
    head2 = list2 = &node1;
    for (int j = 3; j < 14 ; ++j) {
        struct ListNode *p = new ListNode(j);
        head2 -> next = p;
        head2 = head2 ->next;
    }
  // /*
    struct ListNode *result = re.Merge(list1,list2);
    while (result){
//        cout << "2111111" << endl;
        cout << result -> val << " ";
        result = result -> next;
    }
//*/
    return 0;



}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值