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

题目:合并两个递增排序链表,使新链表仍然按照递增排序。

方法一:

基于递归的方法,链表first和链表second各有m和n个结点,新链表的头结点为两个链表中头结点较小

的一个,当找到该头结点时(假设为first的头结点),仍需对first的m-1个结点和second的n个结点合并。

可以看出,子问题和原问题相同,因此可以利用递归解决。

代码如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode mergeTwoLists(ListNode first, ListNode second) {

        if(first==null)
            return second;
        if(second==null)
            return first;

        ListNode head=null;

        if(first.val<second.val)
            {
            head=first;
            head.next=mergeTwoLists(first.next,second);
        }else
            {
            head=second;
             head.next=mergeTwoLists(first,second.next);
        }
        return head;
    }
}

方法二:

基于循环,对两个链表的结点逐个进行比较。

代码如下:

public class Solution {
    public ListNode mergeTwoLists(ListNode first, ListNode second) {
        if(first==null)
            return second;
        if(second==null)
            return first;

        ListNode head=null;
        ListNode temp=null;
        ListNode cur =null;

        //当first和second都没有到各自链表的结尾;
        while(first!=null&&second!=null)
            {
            if(first.val<second.val)
                {
                temp=first;
                first=first.next;
            }else
                {
                temp=second;
                second=second.next;
            }

            if(head==null)
                {
                head=temp;
                cur=temp;
            }else
                {
                cur.next=temp;
                cur=temp;
            }
        }
        //first和second中的一个到链表的结尾;
        if(first!=null)
            {
            cur.next=first;
        }else
            {
            cur.next=second;
        }

        return head;
    }
}
时间: 2024-08-29 19:35:31

链表——(循环和递归)合并两个排序链表的相关文章

链表(14)----合并两个有序链表

1.链表定义 typedef struct ListElement_t_ { void *data; struct ListElement_t_ *next; } ListElement_t; typedef struct List_t_{ int size; int capacity; ListElement_t *head; ListElement_t *tail; } List_t; 2.合并两个有序链表 ListElement_t * MergeList( ListElement_t *

合并两个排序链表

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

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

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

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

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

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

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