两个排序链表的合并(Easy)

问题来源:选自leetcode 21:合并两个有序链表

问题描述: 

题目给定信息:

  给定两个有序链表,把两个链表合并成一个链表,并且合并后的链表依然是有序的。这两个链表中允许有重复元素

问题分析:

  设置一个临时头节点,同时遍历两个原链表,遍历循环的条件是两个链表都不为空的情况下循环才能继续执行。每次遍历两个链表的节点都要比较两个节点的大小,然后把较小的哪一个节点保存在新建临时头节点所表示链表中。但我们要考虑一些特殊的情况,两个链表长度不一样的时候,当循环推出时候还会有一个链表没有遍历结束,这时候我们要判断是哪一个,然后把没有遍历完的链表直接放在新链表的后面即可。

函数实现:

 1 public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
 2         ListNode newHead = new ListNode(-1);
 3         ListNode pre = newHead;
 4         while(l1!=null&&l2!=null) {
 5             if(l1.val<=l2.val) {
 6                 pre.next = l1;
 7                 l1 = l1.next;
 8             }else {
 9                 pre.next = l2;
10                 l2 = l2.next;
11             }
12             pre = pre.next;
13         }
14         if(l1!=null) {
15             pre.next = l1;
16         }
17         if(l2!= null) {
18             pre.next = l2;
19         }
20         return newHead.next;
21     }

运行结果:

原文地址:https://www.cnblogs.com/BaoZiY/p/10685169.html

时间: 2025-01-16 12:29:54

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

递归实现两个有序链表的合并

package com.wyl.linklist; /** * 合并两个链表 * @author wyl */ public class MergeLinkList { /** * 内部类,链表节点的结构 * @author wyl * */ public static class Node{ private int val; //节点值 private Node next; //节点的后继节点 public Node(){ } public Node(int val){ this(val,nu

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

题目:合并两个递增排序链表,使新链表仍然按照递增排序. 方法一: 基于递归的方法,链表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

K个排序链表的合并(Hard)

问题来源:选自leetCode 23:合并K个排序链表 问题描述: 题目给定信息: 不确定需要合并的链表的数目,但依然要求我们把给定的这些有序链表合并成一个链表,并且保证合并的链表依然是有序的. 问题分析: 我们可以使用暴力合并的方法,就是不管有多少个链表,先让第一个链表和第二个链表进行合并,合并之后的结果在和第三个链表进行合并,依次进行下去直到把全部的链表全部合并成一个链表,这种方法是最简单最易想到的方法,但是时间复杂度太高了:还有一种方法是把所有链表中的节点值保存到一个数组中,然后对这个数组

合并两个排序链表

题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路:非递归 class Solution { public:     ListNode* Merge(ListNode* pHead1, ListNode* pHead2)     {         if(!pHead1)             return pHead2;         if(!pHead2)             return pHead1;         Li

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

两个单链表的合并,并排序

/*先看看单链表的知识很快就能做出来 这个用三个结构体指针,两个p1,p2指向建立的链表,一个p3指向新的链表判断判断p1p2指向的数据那个小,小的赋值给p3->next(升序),小的那个p1(p2)下移一个赋值顺序要搞对,要不然指向有误 */ #include<stdlib.h>#include<stdio.h>#include<malloc.h>typedef struct node{ int data; struct node *next;}lnode,*l

[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(