前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >重排奇偶有序链表

重排奇偶有序链表

作者头像
ppxai
发布2023-11-18 08:28:37
820
发布2023-11-18 08:28:37
举报
文章被收录于专栏:皮皮星球

重排奇偶有序链表

给定一个链表,其中奇数位是升序的,偶数位是降序的,实现链表的排序。

思路
  1. 将原始链表按奇偶分开(leetcode原题:奇偶链表, 解答:奇偶链表
  2. 偶链表是降序的,所以将其逆序(leetcode原题:翻转链表, 解答:翻转链表)
  3. 合并两个有序链表(leetcode原题:合并两个有序链表, 解答:合并两个有序链表
代码
代码语言:javascript
复制
package main

import "fmt"

type Node struct {
    Next *Node
    Value int
}

func listMerge(head *Node) *Node {
    if head == nil || head.Next == nil {
        return head
    }

    // divide
    var l1, l2, tmp1, tmp2 *Node
    tmp1 = head
    tmp2 = head.Next
    l1 = tmp1
    l2 = tmp2
    for tmp2 != nil && tmp2.Next != nil {
        tmp1.Next = tmp2.Next
        tmp1 = tmp1.Next

        tmp2.Next = tmp1.Next 
        tmp2 = tmp2.Next
    }
    tmp1.Next = nil

    return merge(l1, reverse(l2))
}

func merge(l1, l2 *Node) *Node {
    var res, tmp *Node

    for l1 != nil && l2 != nil {
        if l1.Value < l2.Value {
            if res == nil {
                res = l1
                tmp = l1
            } else {
                tmp.Next = l1
                tmp = l1
            }
            l1 = l1.Next
        } else {
            if res == nil {
                res = l2
                tmp = l2
            } else {
                tmp.Next = l2
                tmp = l2
            }
            l2 = l2.Next
        }
    }

    if l1 != nil {
        tmp.Next = l1
    }
    if l2 != nil {
        tmp.Next = l2
    }
    return res
}

func reverse(head *Node) *Node {
    var newHead *Node
    for head != nil {
        tmp := head.Next
        head.Next = newHead
        
        newHead = head
        head = tmp
    }
    return newHead
}

func main() {
    h := gen([]int{1, 8, 3, 6, 5, 4, 7, 2, 9})
    r := listMerge(h)
    printList(r)


    h = gen([]int{1, 8, 3, 6, 5, 4, 7, 2})
    r = listMerge(h)
    printList(r)
}

func printList(h *Node) {
    for tmp := h; tmp != nil; tmp = tmp.Next {
        fmt.Printf("%d, ", tmp.Value)
    }
    fmt.Println()
}

func gen(arr []int) *Node {
    dummmy := &Node{}
    head := dummmy
    for _, a := range arr {
        head.Next = &Node{Value: a}
        head = head.Next
    }
    return dummmy.Next
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 重排奇偶有序链表
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档