剑指offer - 题35,36(数组逆序对个数,链表公共节点)

数组逆序对与链表公共节点算法解析
本文深入探讨了数组逆序对的计算方法及链表第一个公共节点的查找技巧,提供了两种高效的算法实现,包括归并排序法统计逆序对数量和双指针法寻找链表交点,旨在帮助读者理解和掌握这些基础数据结构操作。

数组的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:

题目保证输入的数组中没有的相同的数字
数据范围:
	对于%50的数据,size<=10^4
	对于%75的数据,size<=10^5
	对于%100的数据,size<=2*10^5

示例1

输入
1,2,3,4,5,6,7,0
输出
7
# -*- coding:utf-8 -*-
class Solution:
    def InversePairs(self, data):
        # write code here
        # 本来想通过排序后元素下标的变化统计逆序对,但是发现有错,要记得计数万一次就要删掉该元素以免出错,但运行只通过50%
        if not data:
            return 0
        sorted_data = sorted(data)
        index = 0
        result = 0
        for i in range(len(sorted_data)):
            index = data.index(sorted_data[i])
            result+=index
            data.remove(sorted_data[i])
        return result%1000000007

# 能通过的代码:
count = 0
class Solution:
    def InversePairs(self, data):
        global count
        def MergeSort(lists):
            global count
            if len(lists) <= 1:
                return lists
            num = int( len(lists)/2 )
            left = MergeSort(lists[:num])
            right = MergeSort(lists[num:])
            r, l=0, 0
            result=[]
            while l<len(left) and r<len(right):
                if left[l] < right[r]:
                    result.append(left[l])
                    l += 1
                else:
                    result.append(right[r])
                    r += 1
                    count += len(left)-l
            result += right[r:]
            result += left[l:]
            return result
        MergeSort(data)
        return count%1000000007

两个链表的第一个公共节点
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def FindFirstCommonNode(self, pHead1, pHead2):
        # write code here
        node1=pHead1
        node2=pHead2
        while node1 != node2:
            # 为了遍历时保证两个链表长度一致,可以将两条链表拼接起来,有公共节点的两个链表结尾一定是一样的,此题默认一定会有公共节点,所以可以这样写:
            node1=node1.next if node1 else pHead2
            node2=node2.next if node2 else pHead1
        return node1
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值