剑指OFFER之合并两个排序的链表

题目描述

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

解决办法

1、递归方法:

if(pHead1==NULL)
            return pHead2;
        else if(pHead2==NULL)
            return pHead1;
        ListNode* pMerge=NULL;
        if(pHead1->val<=pHead2->val){
            pMerge=pHead1;
            pMerge->next=Merge(pHead1->next,pHead2);
        }
        else{
            pMerge=pHead2;
            pMerge->next=Merge(pHead1,pHead2->next);
        }
        return pMerge;

2、非递归方法:

if(pHead1==NULL)
           return pHead2;
        if(pHead2==NULL)
            return pHead1;
        ListNode* pRet=NULL;
        ListNode* pMerge=NULL;
        if(pHead1->val<=pHead2->val){
            pMerge=pHead1;
            pHead1=pHead1->next;
        }
        else{
            pMerge=pHead2;
            pHead2=pHead2->next;
        }
        pRet=pMerge;
        while(pHead1&&pHead2){
            if(pHead1->val<=pHead2->val){
                pRet->next=pHead1;
                pHead1=pHead1->next;
                pRet=pRet->next;
            }
            else{
                pRet->next=pHead2;
                pHead2=pHead2->next;
                pRet=pRet->next;
            }
        }
        if(pHead1==NULL)
            pRet->next=pHead2;
        if(pHead2==NULL)
            pRet->next=pHead1;
        return pMerge;

本解法困扰了我很久,因为开始时我只设置了一个pMerge指针,而没有设置pRet指针,结果运行后发现,如果是两个等长的序列,那么函数返回的结果只有两个序列的最后一个元素,我折腾了好久才明白,pRet是合并链表的工作指针,函数运行完成后它保存的就是链表的尾元素,而合并链表的真正的头指针是pMerge指针,它才是函数真正的返回结果。

时间: 2024-12-29 10:22:02

剑指OFFER之合并两个排序的链表的相关文章

剑指Offer:合并两个排序的链表【25】

剑指Offer:合并两个排序的链表[25] 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 每次都是比较箭头节点,把小节点连接到已经合并的链表之后,重复的执行此过程,最后如果那个链表已经走完,那就将另一个链表直接连接到合并的链表之后. Java题解 public static ListNode Merge(ListNode list1,ListNode list2) { if(list1==null) return list2;

剑指offer 16.合并两个排序的链表

16.合并两个排序的链表 题目 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路 这题以前也做过的,只需要新建一个表头,然后比较两边的大小,依次加入新的链表,最后再把没用上的加到结尾即可. now代表当前节点,base代表头结点. 代码 public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } public List

剑指Offer 16. 合并两个排序的链表 (链表)

题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目地址 https://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337?tpId=13&tqId=11169&rp=3&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&tPage=1 思

剑指offer:合并两个排序的链表

题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. # -*- coding: utf-8 -*- # @Time : 2019-04-24 10:17 # @Author : Jayce Wong # @ProjectName : job # @FileName : mergeSortedLinkedList.py # @Blog : https://blog.51cto.com/jayce1111 # @Github : https://gi

【剑指OFFER】合并两个排序的链表

[问题描述] 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. [AC代码] 递归版:Reference: https://blog.csdn.net/gsch_12/article/details/81156451 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 1

[剑指Offer] 16.合并两个排序链表

[思路1]递归 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 { 13 if(pHead1 == NULL) 14 return pHead

【剑指offer】合并两有序单链表

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25739727 九度OJ上AC,採用归并的思想递归实现. 题目描写叙述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们须要合成后的链表满足单调不减规则.(hint: 请务必使用链表.) 输入: 输入可能包括多个測试例子,输入以EOF结束.对于每一个測试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的

【剑指offer】Q17:合并两个排序的链表

def Merge(head1, head2): if head1 == None: return head2 if head2 == None: return head1 psuhead = ListNode(-1) tail = psuhead while head1 and head2: if head1.val < head2.val: cur = head1 head1 = head1.next else: cur = head2 head2 = head2.next cur.next

剑指offer(十六) 合并两个排序的链表

合并两个排序的链表 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 用JavaScript非递归和递归方式都AC了. 非递归: function ListNode(x){ this.val = x; this.next = null; } function Merge(pHead1, pHead2) { if(!pHead1) { return !pHead2 ? null:pHead2; }else if(!pHead2) { retur