剑指offer 17:合并两个有序链表

  

题目描述

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

解题思路

链表基础操作考察,难点在于对于输入数据的把握,一定要考虑输入数据的全面性

1.出现单链表为NULL;

2.两个链表都为NULL;

3.一个链表遍历完成,另一链表还有剩余的节点

4.两个链表等长;

下面给出具体C++代码实现:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        //边界检查
        if(pHead1==NULL){
            return pHead2;
        }
        if(pHead2==NULL){
            return pHead1;
        }
        ListNode *p1=pHead1,*p2=pHead2,*nHead=NULL;
        ListNode *q=NULL;
        //确定融合后的头结点
        if (p1->val<=p2->val){
            q = p1;
            p1=p1->next;
        }else{
            q = p2;
            p2=p2->next;
        }
        nHead=q;
        //设置两个指针分别指向两个链表,逐个取元素连接成新的链表
        while(p1!=NULL && p2!=NULL){
            if(p1->val<=p2->val){
                q->next=p1;
                p1=p1->next;
                q=q->next;

            }else{
                q->next=p2;
                p2=p2->next;
                q=q->next;
            }

        }
        if(p1==NULL){
            q->next=p2;
        }else{
            q->next=p1;
        }
        return nHead;
    }
};

原文地址:https://www.cnblogs.com/fancy-li/p/11616133.html

时间: 2024-11-09 17:04:20

剑指offer 17:合并两个有序链表的相关文章

[剑指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:合并两个排序的链表【25】

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

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

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

剑指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之合并两个排序的链表

题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解决办法 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

【剑指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之合并有序链表(九度OJ1519)

题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.(hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数.下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素.接下来一行包含m个元素,s(1<

剑指OFFER之用两个栈实现队列(九度OJ1512)

题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型. 输入: 每个输入文件包含一个测试样例.对于每个测试样例,第一行输入一个n(1<=n<=100000),代表队列操作的个数.接下来的n行,每行输入一个队列操作:1. PUSH X 向队列中push一个整数x(x>=0)2. POP 从队列中pop一个数. 输出: 对应每个测试案例,打印所有pop操作中从队列pop中的数字.如果执行pop操作时,队列为空,则打印-1 样例输入: 3 PUSH 10