合并两个排序链表

题目描述

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

思路:非递归

class Solution {
  public:
      ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
      {
          if(!pHead1)
              return pHead2;
          if(!pHead2)
              return pHead1;
          ListNode* Head;
          ListNode* p;
          //取较小值作头结点
          if(pHead1->val<=pHead2->val){
              Head=pHead1;
              pHead1=pHead1->next;
          }
          else{
              Head=pHead2;
              pHead2=pHead2->next;
          }  
          //开始遍历合并
          p=Head;  //p为合并后的链表的工作指针
          while(pHead1&&pHead2){    //当有一个链表到结尾时,循环结束
              if(pHead1->val<=pHead2->val){         //如果链表1的结点小于链表2的结点
                  p->next=pHead1;                  //取这个结点加入合并链表
                  pHead1=pHead1->next;            //链表1后移一位
                  p=p->next;                    //工作指针后移一位
              }               
              else{                           //否则取链表2的结点

                  p->next=pHead2;
                  pHead2=pHead2->next;
                  p=p->next;
              }                
          }
          if(pHead1 == NULL)           //链表1遍历完了
              p->next = pHead2;        //如果链表2也遍历完了,则pHead2=NULL
          if(pHead2 == NULL)            //链表2遍历完了
              p->next = pHead1;         ///如果链表1也遍历完了,则pHead1=NULL

          return Head;
      }
  };

  

思路:递归算法。

/*
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) return pHead2;
        if(!pHead2)	return pHead1;
        if(pHead1->val <= pHead2->val) {
            pHead1->next= Merge(pHead1->next,pHead2);
            return pHead1;
        }
        else {
            pHead2->next = Merge(pHead1,pHead2->next);
            return pHead2;
        }

    }
};

  

https://www.nowcoder.com/questionTerminal/d8b6b4358f774294a89de2a6ac4d9337

时间: 2024-10-29 19:05:33

合并两个排序链表的相关文章

链表——(循环和递归)合并两个排序链表

题目:合并两个递增排序链表,使新链表仍然按照递增排序. 方法一: 基于递归的方法,链表first和链表second各有m和n个结点,新链表的头结点为两个链表中头结点较小 的一个,当找到该头结点时(假设为first的头结点),仍需对first的m-1个结点和second的n个结点合并. 可以看出,子问题和原问题相同,因此可以利用递归解决. 代码如下: /** * Definition for singly-linked list. * public class ListNode { * int v

剑指offer—第三章高质量代码(合并两个排序链表)

题目:输入员两个递增排序的链表,合并这两个链表并使新的链表中的结点仍然是按照递增排序的. 思路:首先,定义两个头节点分别为Head1和Head2的链表,然后比较第一个节点的值,如果是Head1->mValue比Head2->mValue小,那么头节点,就是Head1,递归实现后面的节点的排序. C++代码: #include<iostream> using namespace std; struct ListNode { int m_nValue; ListNode* m_pNex

[剑指offer] 合并两个排序链表

题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 输入描述 两个单调递增的链表 输出描述 一个单调不减的链表 题目分析 节点申明: public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } 解法一 (递归) 运行时间:31ms 占用内存:629k public class Solution { public Li

[剑指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

[LeetCode]80. Merge Two Sorted Lists合并两个排序链表

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. Subscribe to see which companies asked this question 解法1:递归.首先比较头节点大小,若l2->val>l1->val,则返回mergeTwoLists(

LintCode 合并两个排序链表

样例 给出 1->3->8->11->15->null,2->null, 返回 1->2->3->8->11->15->null. 感觉很像mergeSort /** * Definition of ListNode * class ListNode { * public: * int val; * ListNode *next; * ListNode(int val) { * this->val = val; * this-&

剑指offer_面试题17_合并两个排序的链表(两种思维)

题目:输入两个递增排序的链表,合并这两个链表,并使新链表中的结点仍然是按照递增排序的. 第一种思维:合并两个排序的链表,类似于合并两个排序数组,所不同的仅是一个用链表保存数据,一个用数组保存数据. 算法如下:(下面的算法前提是:头结点 不是 链表的第一个数据节点.) /**方法一:合并两个排序链表,使用了新创建的链表来保存,没有改动两个原始链表*/ ListNode *merge_tow_list(ListNode *pHead1,ListNode *pHead2) { if(NULL == p

leetCode 23. Merge k Sorted Lists (合并k个排序链表) 解题思路和方法

Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 思路:此题是由合并两个排序链表演化而来,刚开始,想法比较简单,像求最大公共前缀一样,逐一求解:但是最后超时,所以马上意识到出题方是为了使用归并和分治的方法,故重新写了代码. 代码一(超时未过): /** * Definition for singly-link

面试题 17:合并两个排序的链表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按 照递增排序的. 两个指针指向两个链表的头结点,取其中值小的作为新链表的头结点,和之前的结点串联,如此递归. 注意用例: 两个链表都为null: 其中一个链表为null: 两个链表有多个结点,有相同的值,不同的值. package offer; /*面试题 17:合并两个排序的链表 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按 照递增排序的.*/ public class Problem17 { st